home *** CD-ROM | disk | FTP | other *** search
/ Alde ADA 1: #1 / CCCC 8804 Volume 1 Number 1 - Alde.iso / C / MISC / FUNC / PROFF.ARC / DOSTUFF2.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-02-21  |  3.7 KB  |  179 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "proff.h"
  4. #include "debug.h"
  5.  
  6. struct hashlist *lookup(char *, struct hashlist **);
  7.  
  8. /*
  9.  * dodef - define a command macro (".de xx" is in buf.)
  10.  *
  11.  */
  12. dodef(buf, fd)
  13. char buf[];
  14. int fd;
  15. {
  16.    char name[MAXNAME], defn[MAXDEF];
  17.    int i, junk;
  18.  
  19.    dprintf("dodef  ");
  20.    i = 0;
  21.    junk = getwrd(buf, &i, name);
  22.    i = getwrd(buf, &i, name);          /* get the name */
  23.    if (i == 0)
  24.       error("missing name in command def.");
  25.    i = 0;
  26.    while (ngetln(buf, fd) != NULL)
  27.    {
  28.       if (buf[0] == cchar && buf[1] == 'e' &&
  29.           buf[2] == 'n' && !isalnum(buf[3]))
  30.          break;
  31.       junk = addstr(buf, defn, &i, MAXDEF);
  32.    }
  33.    if (addset(EOS, defn, &i, MAXDEF) == NO)
  34.       error("definition too long.\n");
  35.    if (install(name, defn, macrotab) == NULL)
  36.       fprintf(stderr, "no room for new definition.\n");
  37. #ifdef DEBUG
  38.    printf("dodef: %s (name) %s (defn)\n", name, defn);
  39. #endif
  40. }
  41.  
  42. /*
  43.  * doesc - expand escapes in buf
  44.  *
  45.  */
  46. doesc(buf, tbuf, size)
  47. char buf[];
  48. char tbuf[];
  49. int size;
  50. {
  51.    int i, j;
  52.  
  53.    dprintf("doesc  ");
  54.    j = 0;
  55.    for (i = 0; buf[i] != EOS && j < size - 1; i++)
  56.       /*
  57.        * clean up generic escapes along the way. 
  58.        */
  59.       if (buf[i] == genesc)
  60.          tbuf[j++] = buf[++i];
  61.  
  62.       else if (buf[i] != ESCAPE)
  63.       {
  64.          tbuf[j] = buf[i];
  65.          j++;
  66.       }
  67.       else if (buf[i + 1] == 'n' && (buf[i + 2] >= 'a' && buf[i + 2] <= 'z'))
  68.       {
  69.          j += itoc(nr[buf[i + 2] - 'a'],
  70.                    &tbuf[j], size - j - 1);
  71.          i += 2;
  72.       }
  73.       else
  74.       {
  75.          tbuf[j] = buf[i];
  76.          j++;
  77.       }
  78.    tbuf[j] = EOS;
  79.    strcpy(buf, tbuf);
  80. }
  81.  
  82. /*
  83.  * dovar - expand variables in buf
  84.  *
  85.  */
  86. dovar(tbuf, buf)
  87. char *buf;
  88. char *tbuf;
  89. {
  90.    register char *c, *p, t;
  91.    struct hashlist *xp;
  92.  
  93.    while (*buf != '\0')
  94.    {
  95.       if (*buf == genesc)
  96.       {
  97.          *tbuf++ = *buf++;
  98.          *tbuf++ = *buf;
  99.       }
  100.       else if (*buf != VESCAPE)
  101.          *tbuf++ = *buf;
  102.       else
  103.       {
  104.          buf++;                        /* skip the ESCAPE */
  105.          if (*buf == '{')
  106.             buf++;
  107.          p = buf;                      /* save the beginning address of variable */
  108.          while (isalnum(*buf))
  109.             buf++;
  110.          t = *buf;                     /* save the character */
  111.          *buf = '\0';                  /* hack a null there */
  112.          if ((xp = lookup(p, gentab)) != NULL)
  113.          {
  114.             c = xp->def;               /* point to def */
  115.             while (*c != '\0')
  116.                *tbuf++ = *c++;
  117.          }
  118.          if (*(p - 1) != '{')
  119.             *tbuf++ = t;
  120.          else if (t != '}')
  121.             fprintf(stderr, "missing \"}\" in %s\n", p);
  122.       }
  123.       buf++;
  124.    }
  125.    *tbuf = '\0';
  126. }
  127.  
  128.  
  129. /*
  130.  * dotabs - expand tabs in buf
  131.  *
  132.  */
  133. dotabs(buf, tbuf, size)
  134. char buf[];
  135. char tbuf[];
  136. int size;
  137. {
  138.    int i, j;
  139.  
  140.    dprintf("dotabs  ");
  141.  
  142.    j = 0;
  143.    for (i = 0; buf[i] != EOS && j < size - 1; i++)
  144.       if (buf[i] == '\t')
  145.          while (j < size - 1)
  146.          {
  147.             tbuf[j] = ' ';
  148.             j++;
  149.             if (tabs[j] == YES || j > INSIZE)
  150.                break;
  151.          }
  152.       else
  153.       {
  154.          tbuf[j] = buf[i];
  155.          j++;
  156.       }
  157.    tbuf[j] = EOS;
  158.    strcpy(buf, tbuf);
  159. }
  160.  
  161. /*
  162.  * docline - produce a "contents" line.
  163.  *
  164.  */
  165. docline(str, width, cline, page)
  166. char *str;
  167. int width;
  168. char *cline;
  169. int page;
  170. {
  171.    int i;
  172.  
  173.    for (i = 0; i < width - 6 && cline[i] != '\0'; i++)
  174.       str[i] = cline[i];
  175.    while (i < width - 6)
  176.       str[i++] = '.';
  177.    sprintf(str + i, "%5d\n", page);
  178. }
  179.